// function request (url, timeout, callback) {
//   timeout = typeof timeout !== 'undefined' ? timeout : 2000
//   callback = typeof callback !== 'undefined' ? callback : function () {}
//   // do something
// }

// function request (url, timeout = 2000, callback = function () {}) {
//   // do something
// }

// function mixArgs (first, sconed) {
//   'use strict'
//   console.log(first === arguments[0])
//   console.log(sconed === arguments[1])
//   first = 'c'
//   sconed = 'd'
//   console.log(first === arguments[0])
//   console.log(sconed === arguments[1])
// }
// mixArgs('a', 'b')
// 会输出：
// true
// true
// false
// false

// function mixArgs (first, sconed = 'b') {
//   console.log(arguments.length)
//   console.log(first === arguments[0])
//   console.log(sconed === arguments[1])
//   first = 'c'
//   sconed = 'd'
//   console.log(first === arguments[0])
//   console.log(sconed === arguments[1])
// }
// mixArgs('a')
// 会输出：
// 1
// true
// false
// false
// false

// function getNum () {
//   return 5
// }
// function add (first, second = getNum()) {
//   return first + second
// }

// console.log(add(1, 1)) // 2
// console.log(1) // 6


// function add (first, second = first) {
//   return first + second
// }

// console.log(add(1, 1)) // 2
// console.log(add(1)) // 2

// function pick (object) {
//   let resut = Object.create(null)
//   // 从第二个参数开始遍历
//   for (let i = 1, len = arguments.length; i < len; i ++) {
//     resut[arguments[i]] = object[arguments[i]]
//   }
//   return resut
// }
// // 以上方法的作用是返回一个给定对象的副本，包含原始对象属性的特定子集。

// let grilFriend = {
//   name: '周芷若',
//   age: 20,
//   height: 165
// }
// let grilFriendData = pick(grilFriend, 'name', 'age')
// console.log(grilFriendData) // 返回对象的副本 { name: '周芷若', age: 20 }
// console.log(grilFriendData.name) // 周芷若
// console.log(grilFriendData.age) // 20

// function pick (object, ...keys) {
//   let resut = Object.create(null)
//   for (let i = 0, len = keys.length; i < len; i ++) {
//     resut[keys[i]] = object[keys[i]]
//   }
//   return resut
// }
// let grilFriend = {
//   name: '周芷若',
//   age: 20,
//   height: 165
// }
// let grilFriendData = pick(grilFriend, 'name', 'age')
// console.log(grilFriendData) // 返回对象的副本 { name: '周芷若', age: 20 }
// console.log(grilFriendData.name) // 周芷若
// console.log(grilFriendData.age) // 20

// function pick (object, ...keys, last) {}

// class Test {
//   set name (...value) {} // 也不可以这么用！
// }

// var add = new Function('first', 'second = 6', 'return first + second')
// console.log(add(1)) // 7

// var pick = new Function('...args', 'return args[0]')
// console.log(pick(3, 2, 1)) // 3

// var a = 2
// var b = 10
// console.log(Math.max(a, b)) // 10

// var arr = [6, 8, 2, 12, 1]
// console.log(Math.max.apply(Math, arr)) // 12

// var arr = [-6, -8, 10, -12, -1]
// console.log(Math.max(...arr, 12)) // 12

// function doSomeThing () {}
// const doAnotherThing = function () {}
// console.log(doSomeThing.name) // doSomeThing
// console.log(doAnotherThing.name) // doAnotherThing

// var doSomeThing = function doSomeThingElse () {}
// var person = {
//   get firstName () {
//     return '周芷若'
//   },
//   sayName () {
//     console.log(this.name)
//   }
// }

// console.log(doSomeThing.name) // doSomeThingElse
// console.log(person.sayName.name) // sayName
// console.log(person.firstName.name) // get firstName

const doSomeThing = function () {}
console.log(doSomeThing.bind().name) // bound doSomeThing
console.log(Function ().name) // anonymous